package com.tankgame;

import java.io.*;
import java.util.Vector;

/**
 * @author 周超
 * @version 1.0
 * 该类记录坦克大战相关信息，和文件进行交互
 */
@SuppressWarnings({"all"})
public class Recorder
{
    //定义变量，记录我方击毁敌人坦克数
    private static int allEnemyTankNum = 0;
    //定义变量，记录累积的积分
    static int score = 0;
    //定义IO对象, 准备写数据到文件中
    private static BufferedWriter bw = null;//输出流
    private static BufferedReader br = null;//输入流
    //private static String recordFile = "d:\\myRecord.txt";
    //记录文件位置  把记录文件保存到 src 下
    private static String recordFile = "src\\myRecord.txt";
    //定义Vector ,指向 MyPanel 对象的 敌人坦克Vector
    private static Vector<EnemyTank> enemyTanks = null;
    //定义一个Vector,保存Node对象node,node对象用于保存未被击中敌人的信息
    private static Vector<Node> nodes = new Vector<>();
    //刚开始敌人坦克数量
    static int enemyTankSize = 14;
    //刚开始我方坦克数量
    static int heroNum = 1;

    //当我方坦克击毁一个敌人坦克，就应当 allEnemyTankNum++
    public static void addAllEnemyTankNum()
    {
        Recorder.allEnemyTankNum++;
    }

    //在类MyPanel里面调用此方法，可以得到类MyPanel里面定义的敌人坦克集合
    public static void setEnemyTanks(Vector<EnemyTank> enemyTanks)
    {
        Recorder.enemyTanks = enemyTanks;
    }
    //编写一个getXXX方法，在其它类可以得到recordFile这个属性
    public static String getRecordFile()  //nodes = Recorder.getNodesAndEnemyTankRec();
    {
        return recordFile;
    }
    //getXXX和setXXX方法
    public static int getAllEnemyTankNum()
    {
        return allEnemyTankNum;
    }
    public static void setAllEnemyTankNum(int allEnemyTankNum)
    {
        Recorder.allEnemyTankNum = allEnemyTankNum;
    }



    //增加一个方法，当游戏退出时，我们将已经击毁的坦克数量allEnemyTankNum保存到recordFile
    //对keepRecord 进行升级, 当退出游戏时，保存还没有被子弹击中的所有敌人坦克的方向和坐标信息
    public static void keepRecord()
    {
        try
        {
            bw = new BufferedWriter(new FileWriter(recordFile));
            bw.write(allEnemyTankNum + "\r\n");
            bw.write(score + "\r\n");
            bw.write(heroNum + "\r\n");
            bw.write(enemyTankSize + "\r\n");
            //遍历敌人坦克的Vector ,然后根据敌人坦克存活情况保存即可.
            //OOP, 定义一个属性，然后通过setXxx得到敌人坦克的Vector
            for (int i = 0; i < enemyTanks.size(); i++)
            {
                //取出敌人坦克
                EnemyTank enemyTank = enemyTanks.get(i);
                if (enemyTank.isLive == true) //建议判断.
                {
                    //保存该enemyTank信息
                    String record = enemyTank.getX() + " " + enemyTank.getY() + " " +
                            enemyTank.getDirect();
                    //写入到文件
                    bw.write(record + "\r\n");
                }
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭流
            try {
                if (bw != null) {
                    bw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //编写方法，用于读取文件recordFile, 得到未被击中坦克的相关信息
    //该方法在选择继续上局游戏的时候调用即可
    public static Vector<Node> getNodesAndEnemyTankRec()//返回一个集合Vector<Node>
    {
        try
        {
            br = new BufferedReader(new FileReader(recordFile));
            allEnemyTankNum = Integer.parseInt(br.readLine());//返回类型不匹配，用Integer进行转换
            score = Integer.parseInt(br.readLine());//返回类型不匹配，用Integer进行转换
            heroNum = Integer.parseInt(br.readLine());//返回类型不匹配，用Integer进行转换
            enemyTankSize = Integer.parseInt(br.readLine());//返回类型不匹配，用Integer进行转换
            //剩下的都是字符串，循环读取文件，生成nodes集合
            String line = "";  //551 0 1
            while((line = br.readLine()) != null)
            {
                //为了拿到横纵坐标和方向的int类型数据，先用split()进行分割，在转换数据类型为int类型
                String[] xyd = line.split(" ");
                Node node = new Node(Integer.parseInt(xyd[0]), Integer.parseInt(xyd[1]),
                                     Integer.parseInt(xyd[2]));
                //为方便管理，把创建好的node加入到Vector
                nodes.add(node);
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return nodes;
    }


}
